我們在 [Day18] Yacc - Ambiguity and Conflicts 有提到,若是在 yacc 出現 conflict 訊息,可以透過下面的編譯指令來產出詳細的衝突訊息說明。
bison -v yacc.y
我們也可以在 yacc 程式中定義一個參數 YYDEBUG,一樣可以輸出衝突訊息到 yacc.output
檔案。
作法也很簡單,只要在 Definition 區塊將 YYDEBUG 的值設為 1。
%{
#define YYDEDUG 1
%}
編譯指令跟原本相同,不需要加 -v 。編譯完成後,yacc.output 檔案也生成出來。
這裡的 yydebug 是小寫字樣,型別為 int 。這樣的寫法可以直接寫在C++程式裡面,而且可以比較彈性的更改數值。功能則跟大寫的 YYDEBUG 相似。
如果你把主程式寫在 Yacc 檔案中,可以這樣寫:
int main() {
int result;
yydebug = 1;
result = yyparse();
if (result == 0) {
printf("Success\n");
} else {
printf("Fail\n");
}
return 0;
}
此處的 yydebug 不用再定義型別了。
如果主程式是寫在外部檔,抓不到 yydebug 的話,可以試著 extern 看看。
到此,我們終於完成了 Lex & Yacc 的所有內容了~
非常感謝一路看到這裡的你,若是有遇到任何疑問,或是文章內容有誤,都歡迎與我聯繫!